# @Time    :2025/3/31 20:52
"""
综合运用封装、继承和多态实现一个游戏角色系统 需求描述 设计一个简单的游戏角色系统，
使用面向对象编程的封装、继承和多态特性，包含以下功能：
 1.  角色基类（Character） ◦
 包含私有属性 __name（角色名称）和 __health（角色生命值）。 ◦
 提供公有方法 get_name 和 get_health 用于获取角色名称和生命值。
 ◦ 提供公有方法 take_damage 用于处理角色受到伤害，减少生命值，当生命值小于等于 0 时，输出角色死亡信息。
  ◦ 提供公有方法 attack（空实现），用于表示角色的攻击行为。
    2.  战士类（Warrior）继承自 Character
  ◦ 包含额外的私有属性 __strength（力量值）。 ◦ 重写 attack 方法，输出战士使用武器攻击的信息，
  并返回造成的伤害值（伤害值为力量值的两倍）。
   3.  法师类（Mage）继承自 Character ◦ 包含额外的私有属性 __magic_power（魔法值）。
   ◦ 重写 attack 方法，输出法师使用魔法攻击的信息，并返回造成的伤害值（伤害值为魔法值的 1.5 倍）。   4.  战斗函数（battle） ◦ 接受两个 Character 类的实例作为参数，模拟两个角色之间的战斗。 ◦ 两个角色轮流攻击对方，直到其中一个角色的生命值小于等于 0 为止。 ◦
输出每一轮攻击的信息，包括攻击者、被攻击者、造成的伤害值和被攻击者剩余的生命值。
"""
class Character:
    def __init__(self, name, health):
        self.__name = name
        self.__health = health

    def get_name(self):
        return self.__name

    def get_health(self):
        return self.__health

    def take_damage(self, damage):
        self.__health -= damage
        if self.__health <= 0:
            print(f"{self.__name} 死亡！")
        else:
            print(f"{self.__name} 受到 {damage} 点伤害，剩余生命值: {self.__health}")

    def attack(self):
        pass


class Warrior(Character):
    def __init__(self, name, health, strength):
        super().__init__(name, health)
        self.__strength = strength

    def attack(self):
        damage = self.__strength * 2
        print(f"{self.get_name()} 使用武器攻击，造成 {damage} 点伤害！")
        return damage


class Mage(Character):
    def __init__(self, name, health, magic_power):
        super().__init__(name, health)
        self.__magic_power = magic_power

    def attack(self):
        damage = self.__magic_power * 1.5
        print(f"{self.get_name()} 使用魔法攻击，造成 {damage} 点伤害！")
        return damage


def battle(character1, character2):
    while character1.get_health() > 0 and character2.get_health() > 0:
        # 角色 1 攻击角色 2
        damage1 = character1.attack()
        character2.take_damage(damage1)
        if character2.get_health() <= 0:
            break
        # 角色 2 攻击角色 1
        damage2 = character2.attack()
        character1.take_damage(damage2)


# 测试代码
warrior = Warrior("战士小明", 100, 20)
mage = Mage("法师小红", 80, 30)

battle(warrior, mage)



# class Character:
#     def __init__(self, name, health):
#         self.__name = name
#         self.__health = health
#
#     def get_name(self):
#         return self.__name
#
#     def get_health(self):
#         return self.__health
#
#     def take_damage(self, damage):
#         self.__health -= damage
#         if self.__health <= 0:
#             print(f"{self.__name} 死亡！")
#         else:
#             print(f"{self.__name} 受到 {damage} 点伤害，剩余生命值: {self.__health}")
#
#     def attack(self, target):
#         pass
#
#
# class Warrior(Character):
#     def __init__(self, name, health, strength):
#         super().__init__(name, health)
#         self.__strength = strength
#
#     def attack(self, target):
#         damage = self.__strength * 2
#         print(f"{self.get_name()} 使用武器攻击 {target.get_name()}，造成 {damage} 点伤害")
#         target.take_damage(damage)
#         return damage
#
#
# class Mage(Character):
#     def __init__(self, name, health, magic_power):
#         super().__init__(name, health)
#         self.__magic_power = magic_power
#
#     def attack(self, target):
#         damage = self.__magic_power * 1.5
#         print(f"{self.get_name()} 使用魔法攻击 {target.get_name()}，造成 {damage} 点伤害")
#         target.take_damage(damage)
#         return damage
#
#
# def battle(character1, character2):
#     round_number = 1
#     while character1.get_health() > 0 and character2.get_health() > 0:
#         print(f"\n第 {round_number} 轮战斗:")
#         character1.attack(character2)
#         if character2.get_health() <= 0:
#             break
#         character2.attack(character1)
#         round_number += 1
#
#
# # 示例使用
# warrior = Warrior("战士", 100, 20)
# mage = Mage("法师", 80, 30)
#
# battle(warrior, mage)